Skip to content

Export a board to PowerPoint, one slide per empty-space area - #92

Merged
marcosqlbi merged 7 commits into
mainfrom
feature/export-e1-powerpoint
Sep 3, 2026
Merged

Export a board to PowerPoint, one slide per empty-space area#92
marcosqlbi merged 7 commits into
mainfrom
feature/export-e1-powerpoint

Conversation

@marcosqlbi

Copy link
Copy Markdown
Collaborator

Why

A .wboard is one unbounded plane. Attendees ask for the board after a session, and a deck is what they can open, annotate, and search. Nothing in the file says where a slide begins, so most of this change is deciding that: docs/export.md is the plan and the alternatives, decision 26 the summary, and docs/export-decisions.md every smaller call made while building it, for review.

What it does

  • File → Export (Ctrl+E, mnemonic E on the File strip) opens a dialog that shows the board with the proposed areas outlined and numbered, and a handful of settings that change the preview live: slides per area or whole board, drawing or reading order, the gap that counts as a separation, the smallest text a slide may carry, 16:9 or 4:3, an overview slide, text containers in the notes.
  • Areas are cut only where the board is empty. A container and its linked strokes are one unit; every other stroke is one. A region is cut at the widest empty band on either axis, recursively, until it fits a slide at the requested text size or nothing can be cut, in which case it is scaled down and the dialog says by how much.
  • Each slide is a picture rendered by the same BoardSurface that draws the screen, at up to 3840×2160, so calligraphy, the highlighter, and SVG come out as seen. The slide title comes from the dominant container (the language service's own title for DAX and SQL), and the area's text containers go in the speaker notes so code can be copied.
  • An overview slide first shows the whole board with the areas numbered.

Where the code is

  • SQLBI.Whiteboard.Core/Export: the partitioner and layout options, covered by the smoke tests with synthetic boards.
  • SQLBI.Whiteboard.Export (new, net10.0, no WPF): the deck writer over DocumentFormat.OpenXml (MIT, managed-only, per decision 21). Added to the pipeline's signing step. The smoke tests open the produced deck.
  • SQLBI.Whiteboard/Export: the rasterizer that generalizes the preview.png renderer, the overlay, the exporter, and the dialog.

The version is not bumped; the changelog line is ready when a release is cut.

🤖 Generated with Claude Code

The board is one unbounded plane with no notion of a page. File > Export
cuts it into areas where it is empty: a container keeps its linked ink,
a stroke that spans two containers keeps them together, and a region is
cut at the widest empty band until it fits a slide at the smallest text
the person accepts. Each area becomes a picture slide rendered by the
same BoardSurface that draws the screen, with the text containers in the
speaker notes and an overview slide first. The dialog previews the areas
numbered on the board and updates as the settings move.

The partitioner lives in Core and is smoke-tested; the deck writer is a
new SQLBI.Whiteboard.Export assembly over the Open XML SDK, listed in the
signing step. docs/export.md is the plan, docs/export-decisions.md the
calls made while implementing it, decision 26 the summary.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
@marcosqlbi
marcosqlbi merged commit ade092a into main Sep 3, 2026
5 checks passed
@marcosqlbi
marcosqlbi deleted the feature/export-e1-powerpoint branch September 3, 2026 18:25
@marcosqlbi
marcosqlbi restored the feature/export-e1-powerpoint branch September 3, 2026 18:25
@marcosqlbi
marcosqlbi deleted the feature/export-e1-powerpoint branch September 3, 2026 18:25
@marcosqlbi
marcosqlbi restored the feature/export-e1-powerpoint branch September 3, 2026 18:27
@marcosqlbi
marcosqlbi deleted the feature/export-e1-powerpoint branch September 3, 2026 18:27
@marcosqlbi
marcosqlbi restored the feature/export-e1-powerpoint branch September 3, 2026 18:27
@marcosqlbi
marcosqlbi deleted the feature/export-e1-powerpoint branch September 3, 2026 18:27
marcosqlbi added a commit that referenced this pull request Sep 3, 2026
…ge (#97)

## Why

Phase E2 of [docs/export.md](docs/export.md), on top of the PowerPoint
export merged in #92. A deck suits a presenter; a PDF suits an attendee
who wants to read, print, or zoom, and PDF has the one freedom a slide
lacks: a page of any size. Replaces #93, which GitHub closed when its
base branch was deleted after the merge.

## What it does

- **PDF is a choice in the same Export dialog.** The dialog relabels
itself (pages rather than slides), hides the slide size and the notes
switch, and shows the page size (A4 or Letter, landscape) and a footer
switch. The areas and the preview are exactly those of the deck, so a
deck and a PDF of the same board agree.
- **One page per area**: the area's picture under a header line with its
title, a bookmark per page, and a footer with the board name, the date,
and "n of m". The overview page comes first when there are at least two
areas.
- **Whole board on one page**: a single page the shape of the board,
rendered at up to 6000 pixels on the longer edge and sized at 144 dpi (a
41-inch page for a 6000-pixel board, under the 200-inch limit viewers
enforce). No header or footer: the page is the board.

## Where the code is

- `SQLBI.Whiteboard.Export/PdfDocumentWriter.cs` over `PdfSharp` 6.2.4
(MIT, managed-only, per decision 21). Fonts are read from the Windows
fonts folder through a small resolver, since PDFsharp's Core build
brings none.
- `ExportSettings` gains the format, page size, and footer;
`BoardExporter` branches on the format and renders the poster larger;
the dialog gains the PDF controls.
- Smoke tests read the produced PDF back: page count, A4 landscape size,
one bookmark per page, and the fit-to-picture page size.

The smaller calls are listed under E2 in
[docs/export-decisions.md](docs/export-decisions.md); decision 26 is
updated, and the 1.3.0 release notes gain their PDF entry.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Fable 5.1 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant